﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.Dominio.ValidationAttribute;
using System.ComponentModel.DataAnnotations;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using System.Runtime.Serialization;

namespace Sistema.Dominio
{
    [DataContract]
    public class EnderecoVO:EntidadeValidavel
    {
        private String _cep;
        private String _logradouro;
        private String _endereco;
        private int _numero;
        private String _complemento;
        private String _bairro;
        private String _cidade;
        private String _estado;
        private String _observacao;

        /// <summary>
        /// Constructor, Inicio as variaveis , nada vai nulo para o banco.
        /// </summary>
        public EnderecoVO()
            :base(typeof(EnderecoVO))
        {
            this._cep = String.Empty;
            this._logradouro = String.Empty;
            this._endereco = String.Empty;
            this._numero = 0;
            this._complemento = String.Empty;
            this._bairro = String.Empty;
            this._cidade = String.Empty;
            this._endereco = String.Empty;
            this._estado = String.Empty;
            this._observacao = String.Empty;
        }

        [DataMember]
        [Required(ErrorMessage="Campo Cep é obrigatório.",AllowEmptyStrings = false)]
        [Cep(ErrorMessage="Cep informado inválido.")]
        public String Cep
        {
            get { return _cep; }
            set { _cep = value; base.RaisePropertyChanged("Cep");}
        }

        [DataMember]
        [StringLength(4,MinimumLength=1, ErrorMessage="Campo logradouro deve ter entre 1 e 4 caracteres.")]
        public String Logradouro
        {
            get { return _logradouro; }
            set { _logradouro = value; base.RaisePropertyChanged("Logradouro"); }
        }

        [DataMember]
        [Required(ErrorMessage="Campo Endereco é obrigatorio.",AllowEmptyStrings=false)]
        [StringLength(150,ErrorMessage="Campo Endereco deve conter no máximo 150 caracteres.")]
        public String Endereco
        {
            get { return _endereco; }
            set { _endereco = value; base.RaisePropertyChanged("Endereco"); }
        }

        [DataMember]
        [Range(0,999999,ErrorMessage="Campo numero deve ter no máximo 6 casas decimais.")]
        public int Numero
        {
            get { return _numero; }
            set
            { _numero = value; base.RaisePropertyChanged("Numero"); }
        }

        [DataMember]
        [StringLength(150,ErrorMessage="Campo Complemento deve conter no máximo 150 caracteres.")]
        public String Complemento
        {
            get { return _complemento; }
            set { _complemento = value; base.RaisePropertyChanged("Complemeneto"); }
        }

        [DataMember]
        [Required(ErrorMessage="Campo Bairro é obrigatório",AllowEmptyStrings=false)]
        [StringLength(150,ErrorMessage="Campo Bairro deve conter no máximo 150 caracteres.")]
        public String Bairro
        {
            get { return _bairro; }
            set { _bairro = value; base.RaisePropertyChanged("Bairro"); }
        }

        [DataMember]
        [Required(ErrorMessage="Campo Cidade é obrigatório.",AllowEmptyStrings=false)]
        [StringLength(50,ErrorMessage="Campo Cidade deve conter no máximo 50 caracteres.")]
        public String Cidade
        {
            get { return _cidade; }
            set { _cidade = value; base.RaisePropertyChanged("Cidade"); }
        }

        [DataMember]
        [StringLengthValidator(2,2,ErrorMessage="Campo estado deve conter 2 caracteres.")]
        public String Estado
        {
            get { return _estado; }
            set { _estado = value; base.RaisePropertyChanged("Estado"); }
        }

        [DataMember]
        public String Observacao
        {
            get { return _observacao; }
            set { _observacao = value; base.RaisePropertyChanged("Observacao"); }
        }

    }

    public enum enumTipoLogradouro
    {
        Rua,
        Av,
        Pc
    }

    public enum enumEstado
    {
        AC,
        AL,
        AM,
        AP,
        BA,
        CE,
        DF,
        ES,
        GO,
        MA,
        MG,
        MS,
        MT,
        PA,
        PB,
        PE,
        PI,
        PR,
        RJ,
        RN,
        RO,
        RS,
        RR,
        SC,
        SE,
        SP,
        TO
    }
}
